Skip to main content

21 异常和中断

异常

异常的发生和捕捉在硬件层面完成,异常的处理由软件完成。

计算机会为每一种可能会发生的异常,分配一个异常代码(Exception Number)。CPU 检测到特殊的信号,叫作发生了一个事件(Event)。

I/O 发出的信号的异常代码由操作系统分配(软件部分)。加法溢出这样的异常代码是由 CPU 预先分配好的(硬件)。

CPU 拿到异常码后,把当前程序执行现场保存到程序栈里,然后根据异常码查询到对应的异常处理程序,最后把后续指令执行的指挥权交给这个异常处理程序。

异常的分类

中断(Interrupt)

程序执行一半被打断

  • 键盘按键

陷阱(Trap)

程序故意主动触发的异常

故障(Fault)

程序被动触发的异常

  • 加法计算发生溢出

中止(Abort)

CPU 遇到故障但无法恢复,程序不得不中止。

异常的处理

保存现场:切换到异常处理程序时,类似去调用一个异常处理函数,要把当前正在执行的指令压栈,异常处理程序执行完成之后,重新回到当前的指令继续执行。

  1. 除了程序压栈外,还要把 CPU 内当前运行程序用到的所有寄存器都放到栈里
  2. 陷阱异常涉及程序指令在用户态和内核态之间的切换,压栈时对应的数据要压到内核栈里
  3. 故障异常在异常处理程序执行完后,继续执行的是故障发生的当前指令,需要重新去执行一次